From ad86c7de55432f636ab4d5d7121d2ba293b42186 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Fri, 27 Nov 2009 08:09:26 +0000 Subject: [PATCH] xm: Allow detaching vif by MAC address Signed-off-by: Masaki Kanno --- tools/python/xen/xm/main.py | 43 +++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/tools/python/xen/xm/main.py b/tools/python/xen/xm/main.py index 78f50ade78..f8d331e42f 100644 --- a/tools/python/xen/xm/main.py +++ b/tools/python/xen/xm/main.py @@ -180,7 +180,7 @@ SUBCOMMAND_HELP = { '[vifname=] [rate=] [model=]' '[accel=]', 'Create a new virtual network device.'), - 'network-detach': (' [-f|--force]', + 'network-detach': (' [-f|--force]', 'Destroy a domain\'s virtual network device.'), 'network-list' : (' [--long]', 'List virtual network interfaces for a domain.'), @@ -2804,23 +2804,44 @@ def xm_block_detach(args): detach(args, 'vbd') def xm_network_detach(args): + arg_check(args, "network-detach", 2, 3) + dom = args[0] + devid = args[1] if serverType == SERVER_XEN_API: - arg_check(args, "network-detach", 2, 3) - dom = args[0] - devid = args[1] vif_refs = server.xenapi.VM.get_VIFs(get_single_vm(dom)) - vif_refs = [vif_ref for vif_ref in vif_refs - if server.xenapi.VIF.\ - get_runtime_properties(vif_ref)["handle"] == devid] + if len(devid.split(":")) == 6: + mac = devid.lower() + vif_refs = [vif_ref for vif_ref in vif_refs + if server.xenapi.VIF.\ + get_record(vif_ref)["MAC"].lower() == mac] + else: + vif_refs = [vif_ref for vif_ref in vif_refs + if server.xenapi.VIF.\ + get_runtime_properties(vif_ref)["handle"] == devid] + if len(vif_refs) > 0: vif_ref = vif_refs[0] server.xenapi.VIF.destroy(vif_ref) else: - print "Cannot find device '%s' in domain '%s'" % (devid,dom) - else: - arg_check(args, 'network-detach', 2, 3) - detach(args, 'vif') + raise OptionError("Cannot find device '%s' in domain '%s'" % (devid, dom)) + else: + if len(devid.split(":")) == 6: + mac = devid.lower() + vifs = server.xend.domain.getDeviceSxprs(dom, "vif") + devids = [vif[0] for vif in vifs + if parse_dev_info(vif[1])["mac"].lower() == mac] + if len(devids) > 0: + devid = str(devids[0]) + else: + raise OptionError("Cannot find device '%s' in domain '%s'" % (devid, dom)) + + vif_args = [dom, devid] + try: + vif_args.append(args[2]) + except IndexError: + pass + detach(vif_args, 'vif') def find_attached(attached, key, detaching): l = filter(lambda dev: pci_dict_cmp(dev, key), attached) -- 2.30.2